//
//  ACBaseViewController.h
//  ACFramework
//
//  Created by caoyq on 2018/5/23.
//  Updated by caoyq on 2018/6/22.
//

#import <UIKit/UIKit.h>
@class ACBaseViewModel;

/**
 * 基于UIViewController的基类，添加快速创建tableView、collectionView，并绑定基类viewModel。
 *
 * 子类须知：
 * 1、子类定义自己的viewModel时，肯定会冲突，因为基类已经有了，但是子类又必须创建，而且名字肯定是viewModel，不然没法使用基类的关联，所以需要做如下操作，还需要重写getter方法
     ```
     @interface XXXSubViewController: ACBaseViewController
     @property (nonatomic, strong) XXXSubViewModel *viewModel;
     @end
 
     @implementation XXXSubViewController
     @synthesize viewModel = _viewModel;
 
     //重写getter方法
     @end
 
     ```
 */
@interface ACBaseViewController : UIViewController<UITableViewDelegate, UITableViewDataSource, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout>

/** tableview */
@property (nonatomic, strong) UITableView *tableView;
/** collectionview */
@property (nonatomic, strong) UICollectionView *collectionView;
/** 数据源，即是viewModel.dataSource的一种简写 */
@property (nonatomic, strong) NSMutableArray *dataSource;

@property (nonatomic, strong) ACBaseViewModel *viewModel;

/**
 初始化方法.自定义tableview的样式.
 
 采用默认的init方法初始化则默认样式为Group.
 
 @param style tableview style
 @return UIViewContrller
 */
- (instancetype)initWithStyle: (UITableViewStyle)style;

#pragma mark - 统一子类常用方法

- (void)configureNavbar;

- (void)configureBaseData;

#pragma mark - TableView

/**
 配置并添加tableview到视图上，子类自定义选择是否添加.
 
 基类中实现的是：初始化一个tableview并添加到view上.
 
 子类：调动该方法，来引入tableview；同时实现相应的数据源和代理方法.
 
 如果是在原有tableview的基础上修改，那么重写该方法并执行 [super configureTableView].
 */
- (void)configureTableView;

#pragma mark - CollectionView

/**
 配置并添加collectionview到视图上，子类自定义选择是否添加.
 
 基类中实现的是：初始化一个collectionview并添加到view上.
 
 子类：调动该方法，来引入collectionview；同时实现相应的数据源和代理方法.
 
 和引入tableview不同，collectionview需要设置flowlayout，所以需要重写下面的 createFlowLayout 方法来自定义一个flowlayout. 或者实现flowlayout的代理就不用重写该方法.
 
 如果是在原有collectionview的基础上修改，那么重写该方法并执行 [super configureCollectionView].
 */
- (void)configureCollectionView;


/**
 自定义一个当前collectionview所需要的flowlayout.子类须重写该方法. 或者实现flowlayout的代理就不用重写该方法.

 @return instance of UICollectionViewFlowLayout.
 */
- (UICollectionViewFlowLayout *)createFlowLayout;

#pragma mark - 可自定义添加的已经完成的功能

/**
 为tableview添加一个点击手势.
 
 代理中屏蔽了cell，所以点击cell不会触发手势.
 
 手势基础功能：键盘消失.
 */
- (void)configureTapGesture;

///手势点击方法（子类可重写来实现自定义的手势点击事件）
- (void)clickedTapAction: (UITapGestureRecognizer *)gesture;

@end
